123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- import { notFound, redirect } from "next/navigation";
- import { OrderDirection, ProductOrderField, SearchProductsDocument } from "@/gql/graphql";
- import { executeGraphQL } from "@/lib/graphql";
- import { Pagination } from "@/ui/components/Pagination";
- import { ProductList } from "@/ui/components/ProductList";
- import { ProductsPerPage } from "@/app/config";
- export const metadata = {
- title: "Search products · Saleor Storefront example",
- description: "Search products in Saleor Storefront example",
- };
- export default async function Page({
- searchParams,
- params,
- }: {
- searchParams: Record<"query" | "cursor", string | string[] | undefined>;
- params: { channel: string };
- }) {
- const cursor = typeof searchParams.cursor === "string" ? searchParams.cursor : null;
- const searchValue = searchParams.query;
- if (!searchValue) {
- notFound();
- }
- if (Array.isArray(searchValue)) {
- const firstValidSearchValue = searchValue.find((v) => v.length > 0);
- if (!firstValidSearchValue) {
- notFound();
- }
- redirect(`/search?${new URLSearchParams({ query: firstValidSearchValue }).toString()}`);
- }
- const { products } = await executeGraphQL(SearchProductsDocument, {
- variables: {
- first: ProductsPerPage,
- search: searchValue,
- after: cursor,
- sortBy: ProductOrderField.Rating,
- sortDirection: OrderDirection.Asc,
- channel: params.channel,
- },
- revalidate: 60,
- });
- if (!products) {
- notFound();
- }
- const newSearchParams = new URLSearchParams({
- query: searchValue,
- ...(products.pageInfo.endCursor && { cursor: products.pageInfo.endCursor }),
- });
- return (
- <section className="mx-auto max-w-7xl p-8 pb-16">
- {products.totalCount && products.totalCount > 0 ? (
- <div>
- <h1 className="pb-8 text-xl font-semibold">Search results for "{searchValue}":</h1>
- <ProductList products={products.edges.map((e) => e.node)} />
- <Pagination
- pageInfo={{
- ...products.pageInfo,
- basePathname: `/search`,
- urlSearchParams: newSearchParams,
- }}
- />
- </div>
- ) : (
- <h1 className="mx-auto pb-8 text-center text-xl font-semibold">Nothing found :(</h1>
- )}
- </section>
- );
- }
|